//create thread 创建线程
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
// 线程函数,指针函数
/* 使用 void* 作为参数和返回类型使得thread_fun可以是任何类型的函数。
 * 这样，线程启动时可以传递任何类型的数据给线程函数，线程函数也可以返回
 * 任何类型的数据（尽管在实际应用中，通常只使用 void* 来传递和返回指针）。
 */
void * thread_fun();
int main()
{
	// 创建线程返回值
	int rtn1,rtn2;
	// 回收线程返回值
	int rtn;
	//子线程id，即tid
	pthread_t thread_id1,thread_id2;
	//创建线程1
	rtn1 = pthread_create(&thread_id1,NULL,thread_fun,NULL);
	if(rtn1 != 0)
	{
		perror("线程1创建失败!");
		exit(1);
	}
	//创建线程2
	rtn2 = pthread_create(&thread_id2,NULL,thread_fun,NULL);
	if(rtn2 != 0)
	{
		perror("线程2创建失败!");
		exit(1);
	}
	for(int n=10;n>0;n--)
	{
		printf("这是父进程,PID= %d\n",getpid());
		sleep(1);
	}
	sleep(1);
	printf("回收线程1\n");	
	rtn = pthread_join(thread_id1,NULL);
	printf("回收线程2\n");	
	rtn = pthread_join(thread_id2,NULL);
	printf("父线程运行结束\n");
	return 0;
}
//线程函数
void * thread_fun()
{
	//子线程id
	pthread_t new_thid;
	//获取子线程id
	new_thid = pthread_self();
	for(int m=10;m>0;m--)
	{ 
		printf("这是线程,TID = %u\n",new_thid);
		sleep(1);
	}
	printf("线程TID=%u结束\n",new_thid);
	pthread_exit("线程结束");
}
